package com.lijiajian.Service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lijiajian.base.BaseService;
import com.lijiajian.dao.ModuleMapper;
import com.lijiajian.dao.PermissionMapper;
import com.lijiajian.model.TreeModel;
import com.lijiajian.pojo.CusDevPlan;
import com.lijiajian.pojo.Module;
import com.lijiajian.utils.AssertUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import sun.reflect.generics.tree.Tree;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class ModuleService extends BaseService<Module,Integer> {
    @Resource
    private ModuleMapper moduleMapper;
    @Resource
    private PermissionMapper permissionMapper;

    public List<TreeModel> queryAllModules(Integer roleId){
        //查询所有的资源列表
        List<TreeModel> treeModels = moduleMapper.queryAllModules();
        //查询指定角色已经授权过的资源列表(id)
        List<Integer> permissionIds=permissionMapper.queryModuleIdByRoleId(roleId);
        //判断角色是否拥有资源id
        if(permissionIds!=null&&permissionIds.size()>0){
            //循环所有的资源列表，判断用户拥有的资源id中是否有匹配的，有设置checked属性为true
            for(TreeModel treeModel:treeModels){
                if(permissionIds.contains(treeModel.getId())){
                    treeModel.setChecked(true);
                }
            }
        }
        return treeModels;
    }

    public Map<String,Object> queryModuleList(){
        List<Module> moduleList = moduleMapper.queryModuleList();
        Map<String,Object> map=new HashMap<>();

        map.put("code",0);
        map.put("msg","success");
        map.put("data",moduleList);

        return map;
    }

    /**
     * 添加资源
     * @param module
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void addModule(Module module){
        /*参数校验*/
        //层级grade，非空0、1、2
        Integer grade = module.getGrade();
        AssertUtil.isTrue(null==grade||!(grade==0||grade==1||grade==2),"请输入正确的菜单层级（0、1、2）");

        //模块名称非空、同一层级下模块名称唯一
        AssertUtil.isTrue(StringUtils.isBlank(module.getModuleName()),"模块名称不能为空！");
        AssertUtil.isTrue(null!=moduleMapper.queryModuleByNameAndGrade(grade,module.getModuleName()),"同一层级模块名称不能一样");
        //地址url、二级菜单（grade=1）非空且不可重复
        if(grade==1){
            AssertUtil.isTrue(StringUtils.isBlank(module.getUrl()),"地址不能为空");
            AssertUtil.isTrue(null!=moduleMapper.queryModuleByUrlAndGrade(grade,module.getUrl()),"url在同一层级不能重复");
        }
        //父级菜单parentId,一级菜单-1,二级或三级菜单非空且父级菜单必须存在
        if(grade==0){
            //一级菜单
            module.setParentId(-1);
        }else{
            AssertUtil.isTrue(null==module.getParentId(),"父级菜单不能为空");
            AssertUtil.isTrue(null==moduleMapper.selectByPrimaryKey(module.getParentId()),"父级菜单不存在");
        }
        //权限码optValue 非空，不可重复
        AssertUtil.isTrue(null==module.getOptValue(),"权限码不能为空");
        AssertUtil.isTrue(null!=moduleMapper.queryModuleByOptValue(module.getOptValue()),"权限码不能重复");
        /*设置参数默认值*/
        module.setIsValid((byte)1);
        module.setCreateDate(new Date());
        module.setUpdateDate(new Date());
        /*执行添加操作*/
        AssertUtil.isTrue(moduleMapper.insertSelective(module)!=1,"添加失败");
    }

    /**
     * 修改资源
     * @param module
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void updateModule(Module module){
        /*参数校验*/
        //id非空，数据存在
        AssertUtil.isTrue(null==module.getId(),"id不能为空");
        Module temp = moduleMapper.selectByPrimaryKey(module.getId());
        AssertUtil.isTrue(null==temp,"数据不存在");
        //层级grade，非空0、1、2
        Integer grade = module.getGrade();
        AssertUtil.isTrue(null==grade||!(grade==0||grade==1||grade==2),"请输入正确的菜单层级（0、1、2）");

        //模块名称非空、同一层级下模块名称唯一
        AssertUtil.isTrue(StringUtils.isBlank(module.getModuleName()),"模块名称不能为空！");
        temp = moduleMapper.queryModuleByNameAndGrade(grade, module.getModuleName());

        AssertUtil.isTrue(null!=temp && !temp.getId().equals(module.getId()),"同一层级模块名称不能一样");
        //地址url、二级菜单（grade=1）非空且不可重复
        if(grade==1){
            AssertUtil.isTrue(StringUtils.isBlank(module.getUrl()),"地址不能为空");
            temp = moduleMapper.queryModuleByUrlAndGrade(grade, module.getUrl());
            AssertUtil.isTrue(null!=temp && !temp.getId().equals(module.getId()),"url在同一层级不能重复");
        }
        //父级菜单parentId,一级菜单-1,二级或三级菜单非空且父级菜单必须存在
        if(grade==0){
            //一级菜单
            module.setParentId(-1);
        }else{
            AssertUtil.isTrue(null==module.getParentId(),"父级菜单不能为空");
            AssertUtil.isTrue(null==moduleMapper.selectByPrimaryKey(module.getParentId()),"父级菜单不存在");
        }
        //权限码optValue 非空，不可重复
        AssertUtil.isTrue(null==module.getOptValue(),"权限码不能为空");
        temp=moduleMapper.queryModuleByOptValue(module.getOptValue());
        AssertUtil.isTrue(null!=temp && !temp.getId().equals(module.getId()),"权限码不能重复");
        /*设置参数默认值*/
        module.setUpdateDate(new Date());
        /*执行修改操作*/
        AssertUtil.isTrue(moduleMapper.updateByPrimaryKeySelective(module)!=1,"修改失败");
    }

    /**
     * 删除资源
     * @param id
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void deleteModule(Integer id){
        AssertUtil.isTrue(null==id,"待删除记录不存在");
        Module temp = moduleMapper.selectByPrimaryKey(id);
        AssertUtil.isTrue(null==temp,"待删除记录不存在");
        //判断当前资源是否存在子记录，存在不可删除
        Integer count=moduleMapper.queryModuleByParentId(id);

        AssertUtil.isTrue(count>0,"该资源存在子记录，不可删除");
        //通过资源id查询权限表中是否存在数据，存在就删除
        count=permissionMapper.countPermissionByModuleId(id);

        if(count>0){
            permissionMapper.deletePermissionByModuleId(id);
        }

        temp.setIsValid((byte)0);
        temp.setUpdateDate(new Date());
        AssertUtil.isTrue(moduleMapper.updateByPrimaryKeySelective(temp)!=1,"删除失败");
    }
}
